using Assets.Scripts.UI;
using Photon.Pun;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviourPunCallbacks
{
    #region 单例
    public static Player Instance;
    void Awake()
    {
        Instance = this;
    }
    #endregion



    #region 玩家信息相关
    private int currHP;
    public int CurrHP
    {
        get => currHP;
        set
        {
            currHP = value;
            // 更新UI
            //UI_MainPanel.Instance.UpdatePlayer_HP(CurrHP);
            if (currHP == 0)
            {
                playerDeathCount++;
            }
        }
    }
    #endregion


    #region 选择卡相关
    // 当前选择的卡-有可能会使用的卡
    public int currSelectCardID = -1;
    // 当前玩家手里的卡， id,卡配置
    private Dictionary<int, CardDefine> currCardDic = new Dictionary<int, CardDefine>();
    private int currCardID;

    // 当前玩家选择的传送带上的牌（包括普通抽牌）
    public int currBeltSelectedCardID = -1;
    #endregion


    #region 玩家操作相关
    // 玩家的操作记录-是否按了出牌
    private bool operationIsOk = false;

    // 玩家的操作记录-是否按了结束回合或者取消出牌
    private bool operationIsNot = false;
    #endregion


    #region 逻辑判断相关
    // 当前是否是我的主动回合
    private bool isInitiativeRound = true;

    // 对方当前出的卡
    private CardDefine responseTargetCard;

    // 是否正在等待敌人
    public bool isWaitOther = false;
    #endregion

    #region 网络相关
    private void Start()
    {
        UIMain_Panel.Instance.Gaming.Add("IsWaitOther", isWaitOther);
    }
    public override void OnPlayerPropertiesUpdate(Photon.Realtime.Player targetPlayer, ExitGames.Client.Photon.Hashtable changedProps)
    {
        if (targetPlayer != PhotonNetwork.LocalPlayer)
        {
            isWaitOther = (bool)changedProps["IsWaitOther"];
        }
    }
    #endregion






    #region 卡牌的获取与弃置
    /// <summary>
    /// 获取卡
    /// </summary>
    public void GetCard(CardDefine card)
    {
        currCardDic.Add(currCardID, card);

        // 更新UI
        UIMain_Panel.Instance.AddCard(currCardID, card);
        // 更新UI
        UIMain_Panel.Instance.UpdateStandByCard_Player(currCardDic.Count);
        currCardID += 1;
    }
    /// <summary>
    /// 移除全部卡
    /// </summary>
    public void RemoveAllCard()
    {
        currCardDic.Clear();
        // 更新UI
        UIMain_Panel.Instance.RemoveAllCard();
    }
    #endregion


    #region 检查卡能不能出
    /// <summary>
    /// 检查这张卡能不能出
    /// </summary>
    public bool CheckCard(int cardID)
    {
        // 是主动回合
        if (isInitiativeRound)
        {
            // 能不能主动释放
            if (currCardDic[cardID].IsInitiative)
            {
                // 不能满血释放 同时 HP是满血
                if (!currCardDic[cardID].FullHPCanInitiative && CurrHP == 4)
                {
                    return false;
                }
                else
                {
                    return true;
                }
            }
        }
        // 不是主动回合- 是响应别人，就是别人对我出杀了
        else
        {
            // 当前选择的卡，是不是可以响应敌人出的卡
            if (currCardDic[cardID].RespondCards.Contains(responseTargetCard))
            {
                return true;
            }
        }
        return false;
    }
    #endregion

    #region 按钮操作
    /// <summary>
    /// 玩家在UI那边点了确认
    /// </summary>
    public void Confirm_ButtonClick()
    {
        operationIsOk = true;
    }

    /// <summary>
    /// 玩家在UI那边点了取消
    /// </summary>
    public void Cancel_ButtonClick()
    {
        operationIsNot = true;
    }
    #endregion

    #region 进入主动回合
    /// <summary>
    /// 进入主动回合
    /// </summary>
    public IEnumerator EnterRound()
    {
        isWaitOther = false;
        // 等待玩家操作...
        yield return StartCoroutine(UpdateTime());
    }

    public int playerDeathCount = 0;    // 记录玩家的死亡数

    /// <summary>
    /// 主回合更新逻辑
    /// </summary>
    private IEnumerator UpdateTime()
    {
        float currTime = 0;
        operationIsOk = false;
        operationIsNot = false;
        isInitiativeRound = true;

        // 玩家没有点确认、没点取消、操作时间也没到（假设一回合要在15秒内出一次牌）
        while (!operationIsOk
            && !operationIsNot
            && currTime < 15f)
        {
            // 等待玩家操作,显示按钮和倒计时UI
            //UIMain_Panel.Instance.IsMyTurn = true;

            // 此处可能等待敌人的操作,比如玩家对敌人出杀后，等待敌人是否出闪
            while (isWaitOther)
            {
                yield return null;
            }
            yield return null;
            currTime += Time.deltaTime;
            // 刷新时间UI
            UIMain_Panel.Instance.UpdateTime((15 - currTime) / 15);
        }

        // 玩家操作了 或者时间到
        //UIMain_Panel.Instance.IsMyTurn = false;

        // 出牌了
        if (operationIsOk)
        {
            // 出牌
            yield return StartCoroutine(DoUseCard());
            // 递归，让玩家继续可以出牌
            yield return StartCoroutine(UpdateTime());
        }
        // 点击了回合结束，或者倒计时结束了
        else if (operationIsNot || currTime >= 15f)
        {
            UIMain_Panel.Instance.IsMyTurn = false;
            UIMain_Panel.Instance.Gaming["IsWaitOther"] = UIMain_Panel.Instance.IsMyTurn;
            PhotonNetwork.LocalPlayer.SetCustomProperties(UIMain_Panel.Instance.Gaming);    // 通知对方该进入player脚本的【主回合】协程了

            StopAllCoroutines();    // 停止所有的player脚本协程，进入enemy脚本的【主回合】协程
        } 
    }

    /// <summary>
    /// 执行使用卡片-主动回合的情况
    /// </summary>
    private IEnumerator DoUseCard()
    {
        operationIsOk = false;
        CardDefine card = currCardDic[currSelectCardID];

        // 使用卡片,方法结束后 逻辑层面和显示层面都没有这张卡了
        UseCard(currSelectCardID);

        // 使用卡有可能需要对方响应
        if (card.CanBeResponse)
        {
            // 敌人进入响应，当敌人响应结束，应该恢复 isWaitOther
            isWaitOther = true;
            UIMain_Panel.Instance.Gaming["IsWaitOther"] = isWaitOther;
            PhotonNetwork.LocalPlayer.SetCustomProperties(UIMain_Panel.Instance.Gaming);

            // 刷新UI
            UIMain_Panel.Instance.IsMyTurn = false;
            // 等待敌人响应
            yield return Enemy.Instance.StartCoroutine(Enemy.Instance.EnterResponse(card));

            yield return null;
            isWaitOther = false;
        }
        // 运行到这里，意味着打出去一张卡，操作结束
    }
    /// <summary>
    /// 卡牌生效
    /// </summary>
    private void UseCard(int cardId)
    {
        CardDefine card = currCardDic[cardId];
        // 如果有恢复能力
        if (card.Recover > 0)
        {
            CurrHP += card.Recover;
        }
        // 恢复UI
        UIMain_Panel.Instance.CanUseCard = false;
        UIMain_Panel.Instance.UserCard_Effect(card);
        // 从手里移除这张卡
        currCardDic.Remove(cardId);                     // 逻辑层面删除这个卡
        UIMain_Panel.Instance.UpdateStandByCard_Player(currCardDic.Count);   // 更新手牌剩余数UI
        UIMain_Panel.Instance.RemoveCard(cardId);       // 显示层面删除这个卡
    }
    #endregion

    #region 进入响应回合
    /// <summary>
    /// 进入响应
    /// </summary>
    public IEnumerator EnterResponse(CardDefine card)
    {
        float currTime = 0;
        operationIsOk = false;
        operationIsNot = false;
        isInitiativeRound = false;

        // 保存对方使用的卡
        responseTargetCard = card;

        // 等待玩家操作
        UIMain_Panel.Instance.IsMyTurn = true;
        while (!operationIsOk
            && !operationIsNot
            && currTime < 15f)
        {
            yield return null;
            currTime += Time.deltaTime;
            UIMain_Panel.Instance.UpdateTime((15 - currTime) / 15);
        }

        // 玩家操作了 或者时间到
        UIMain_Panel.Instance.IsMyTurn = false;

        // 出牌了
        if (operationIsOk)
        {
            // 响应成功 把卡使用掉
            UseCard(currSelectCardID);

            // 通知对方我已成功响应，该继续回到对方的主回合了
            isWaitOther = false;
            UIMain_Panel.Instance.Gaming["IsWaitOther"] = isWaitOther;
            PhotonNetwork.LocalPlayer.SetCustomProperties(UIMain_Panel.Instance.Gaming);
        }
        // 取消了，主动放弃了
        // 意味着对方的卡生效
        else if (operationIsNot || currTime >= 15f)
        {
            if (card.Attack > 0)
            {
                // 更新血量
                CurrHP -= card.Attack;
            }
            //UIMain_Panel.Instance.AudioSource.PlayOneShot(card.takeEffectAudioClip);

            // 通知对方，该继续回到对方的主回合了
            isWaitOther = false;
            UIMain_Panel.Instance.Gaming["IsWaitOther"] = isWaitOther;
            PhotonNetwork.LocalPlayer.SetCustomProperties(UIMain_Panel.Instance.Gaming);
        }
        StopAllCoroutines();
    }
    #endregion

}
